﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Web;
using System.Web.Hosting;
using System.Web.Http;
using ezCloud.Api.Common;

namespace ezCloud.Api.Controllers
{
    [RoutePrefix("api/Captcha")]
    public class CaptchaController : ezController
    {
        //Test api
        public static int captchaCount = 0;
        public static Hashtable captchaQueue = new Hashtable();
        public HttpResponseMessage Get(int id)
        {

            string sCaptchaText;
            Random oRandom = new Random();
            if (!captchaQueue.ContainsKey(id))
            {

                int iNumber = oRandom.Next(100000, 999999);
                string randomCaptcha = iNumber.ToString();
                captchaQueue.Add(id, randomCaptcha);
                if (id > captchaCount)
                    captchaCount = id;
            }
            sCaptchaText = (string)captchaQueue[id];
            var result = new HttpResponseMessage(HttpStatusCode.OK);
            int iHeight = 50;
            int iWidth = 190;


            int[] aBackgroundNoiseColor = new int[] { 150, 150, 150 };
            int[] aTextColor = new int[] { 0, 0, 0 };
            int[] aFontEmSizes = new int[] { 15, 20, 25, 30, 35 };

            string[] aFontNames = new string[] {
												 "Comic Sans MS",
												 "Arial",
												 "Times New Roman",
												 "Georgia",
												 "Verdana",
												 "Geneva"
												};

            FontStyle[] aFontStyles = new FontStyle[] {  
													FontStyle.Bold,
													FontStyle.Italic,
													FontStyle.Regular,
													FontStyle.Strikeout,
													FontStyle.Underline
												};
            HatchStyle[] aHatchStyles = new HatchStyle[] {
                                            HatchStyle.BackwardDiagonal, HatchStyle.Cross, 
	                                        HatchStyle.DashedDownwardDiagonal, HatchStyle.DashedHorizontal,
                                            HatchStyle.DashedUpwardDiagonal, HatchStyle.DashedVertical, 
	                                        HatchStyle.DiagonalBrick, HatchStyle.DiagonalCross,
                                            HatchStyle.Divot, HatchStyle.DottedDiamond, HatchStyle.DottedGrid, 
	                                        HatchStyle.ForwardDiagonal, HatchStyle.Horizontal,
                                            HatchStyle.HorizontalBrick, HatchStyle.LargeCheckerBoard, 
	                                        HatchStyle.LargeConfetti, HatchStyle.LargeGrid,
                                            HatchStyle.LightDownwardDiagonal, HatchStyle.LightHorizontal, 
	                                        HatchStyle.LightUpwardDiagonal, HatchStyle.LightVertical,
                                            HatchStyle.Max, HatchStyle.Min, HatchStyle.NarrowHorizontal, 
	                                        HatchStyle.NarrowVertical, HatchStyle.OutlinedDiamond,
                                            HatchStyle.Plaid, HatchStyle.Shingle, HatchStyle.SmallCheckerBoard, 
	                                        HatchStyle.SmallConfetti, HatchStyle.SmallGrid,
                                            HatchStyle.SolidDiamond, HatchStyle.Sphere, HatchStyle.Trellis, 
	                                        HatchStyle.Vertical, HatchStyle.Wave, HatchStyle.Weave,
                                            HatchStyle.WideDownwardDiagonal, HatchStyle.WideUpwardDiagonal, HatchStyle.ZigZag
                                        };

            //Get Captcha in Session


            //Creates an output Bitmap
            Bitmap oOutputBitmap = new Bitmap(iWidth, iHeight, PixelFormat.Format24bppRgb);
            Graphics oGraphics = Graphics.FromImage(oOutputBitmap);
            oGraphics.TextRenderingHint = TextRenderingHint.AntiAlias;

            //Create a Drawing area
            RectangleF oRectangleF = new RectangleF(0, 0, iWidth, iHeight);
            Brush oBrush = default(Brush);

            //Draw background (Lighter colors RGB 100 to 255)
            oBrush = new HatchBrush(aHatchStyles[oRandom.Next
                (aHatchStyles.Length - 1)], Color.FromArgb((oRandom.Next(100, 255)),
                (oRandom.Next(100, 255)), (oRandom.Next(100, 255))), Color.White);
            oGraphics.FillRectangle(oBrush, oRectangleF);

            System.Drawing.Drawing2D.Matrix oMatrix = new System.Drawing.Drawing2D.Matrix();
            int i = 0;
            for (i = 0; i <= sCaptchaText.Length - 1; i++)
            {
                oMatrix.Reset();
                int iChars = sCaptchaText.Length;
                int x = iWidth / (iChars + 1) * i;
                int y = iHeight / 2;

                //Rotate text Random
                oMatrix.RotateAt(oRandom.Next(-20, 20), new PointF(x, y));
                oGraphics.Transform = oMatrix;

                //Draw the letters with Random Font Type, Size and Color
                oGraphics.DrawString
                (
                    //Text
                sCaptchaText.Substring(i, 1),
                    //Random Font Name and Style
                new Font(aFontNames[oRandom.Next(aFontNames.Length - 1)],
                   aFontEmSizes[oRandom.Next(aFontEmSizes.Length - 1)],
                   aFontStyles[oRandom.Next(aFontStyles.Length - 1)]),
                    //Random Color (Darker colors RGB 0 to 100)
                new SolidBrush(Color.FromArgb(oRandom.Next(0, 100),
                   oRandom.Next(0, 100), oRandom.Next(0, 100))),
                x,
                oRandom.Next(0, 15)
                );
                oGraphics.ResetTransform();
            }
            MemoryStream memoryStream = new MemoryStream();
            oOutputBitmap.Save(memoryStream, ImageFormat.Jpeg);
            result.Content = new ByteArrayContent(memoryStream.ToArray());
            result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");

            return result;
        }
        [Route("Create")]
        public Models.CaptchaModel GetCaptcha()
        {
            var captcha = new Models.CaptchaModel();
            captchaCount++;
            captcha.CaptchaId = captchaCount;
            captcha.ImageUrl = Common.Utilities.FullyQualifiedApplicationPath + "/api/Captcha/" + captcha.CaptchaId.ToString();
            Random oRandom = new Random();
            int iNumber = oRandom.Next(100000, 999999);
            string randomCaptcha = iNumber.ToString();
            //Generate random string
            captchaQueue.Add(captchaCount, randomCaptcha);
            return captcha;
        }
        
        public static bool CaptchaVerify(int id, string code)
        {
            var result = false;
            if (captchaQueue.ContainsKey(id))
            {
                if ((string)captchaQueue[id] == code)
                {
                    //Remove captcha
                    captchaQueue.Remove(id);
                    result = true;
                }
              
            }
            return result;
        }
    }
}
